package dao;

import util.PinyinUtil;

import java.io.File;
import java.math.BigDecimal;
import java.text.DateFormat;
import java.text.SimpleDateFormat;

//类的实例代表file_meta表里的每个记录.
public class FileMeta {
    private int id;
    private String name;
    private String path;
    private boolean isDirectory;
    //下面两个属性,在java代码中,可以没有
    //这两个属性都是根据上述的name属性来的.
    //可以直接给这个类加两个get方法来获取到pinyin和pinyinFirst
    //private String pinyin;
    //private String pinyinFirst;
    //size单位是字节,最终给界面上显示的内容,不应该以字节为单位.
    //应该把字节换算为比较合适到的单位.
    private long size;
    //表示更好阅读的size
    //private String sizeText;
    //last_modified是时间戳,这是一个很大的数字
    //直接显示在界面上也不好看,而要进行格式化转换
    private long lastModified;
    // 放进get方法里
    //private String lastModifiedTest;

    public String getPinyin(){
        return PinyinUtil.get(name,true);
    }
    public String getPinyinFirst(){
        return PinyinUtil.get(name,false);
    }

    public FileMeta( String name, String path, boolean isDirectory, long size, long lastModified) {
        this.name = name;
        this.path = path;
        this.isDirectory = isDirectory;
        this.size = size;
        this.lastModified = lastModified;
    }


    public FileMeta(File f){
        this(f.getName(),f.getParent(),f.isDirectory(),f.length(),f.lastModified());
    }

    @Override
    public boolean equals(Object o){
        if (this == o){
            //看看是不是自己和自己比较
            return true;
        }
        if (o == null){
            //针对o为null的特殊处理
            return false;
        }
        if (getClass() != o.getClass()){
            //比较类型
            return false;
        }
        FileMeta fileMeta = (FileMeta) o;
        return name.equals(fileMeta.getName()) && path.equals(fileMeta.getPath()) &&isDirectory ==fileMeta.isDirectory;
    }

    public String getSizeText(){
        //通过这个方法,把size的值进行合理的单位换算,换成更易读的结果.
        //单位主要是Byte,KB,MB,GB
        ///由于单个文件不太可能达到TB,所以只考虑上述四个单位.
        //看size的大小进行换算
        //size<1024,直接使用Byte即可.
        //size>=1024并且<1024*1024单位使用MB
        //假设size是1025,显示的结果是1.001MB
        //这里的关键思路:
        //1.比较size和1024之间的大小关系
        //2.如果size<1024,直接获取到结果;如果size>=1024,则出等于1024,并且单位换算一下
        double curSize = size;
        String[] units = {"Byte","KB","MB","GB"};
        for (int level = 0; level < units.length; level++){
            if (curSize < 1024){
                return String.format("%.2f" + units[level],new BigDecimal(curSize));
            }
            curSize/=1024;
        }
        //当单位升级到GB还不够用,就还以GB为单位
        return String.format(".2f GB",new BigDecimal(curSize));
    }

    public String getLastModifiedText(){
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return dateFormat.format(lastModified);
    }

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public String getPath() {
        return path;
    }

    public boolean isDirectory() {
        return isDirectory;
    }

    public long getSize() {
        return size;
    }

    public long getLastModified() {
        return lastModified;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setPath(String path) {
        this.path = path;
    }

    public void setDirectory(boolean directory) {
        isDirectory = directory;
    }

    public void setSize(long size) {
        this.size = size;
    }

    public void setLastModified(long lastModified) {
        this.lastModified = lastModified;
    }
}
